home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / fpformat.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  187 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''General floating point formatting functions.
  5.  
  6. Functions:
  7. fix(x, digits_behind)
  8. sci(x, digits_behind)
  9.  
  10. Each takes a number or a string and a number of digits as arguments.
  11.  
  12. Parameters:
  13. x:             number to be formatted; or a string resembling a number
  14. digits_behind: number of digits behind the decimal point
  15. '''
  16. import re
  17. __all__ = [
  18.     'fix',
  19.     'sci',
  20.     'NotANumber']
  21. decoder = re.compile('^([-+]?)0*(\\d*)((?:\\.\\d*)?)(([eE][-+]?\\d+)?)$')
  22.  
  23. try:
  24.     
  25.     class NotANumber(ValueError):
  26.         pass
  27.  
  28. except TypeError:
  29.     NotANumber = 'fpformat.NotANumber'
  30.  
  31.  
  32. def extract(s):
  33.     """Return (sign, intpart, fraction, expo) or raise an exception:
  34.     sign is '+' or '-'
  35.     intpart is 0 or more digits beginning with a nonzero
  36.     fraction is 0 or more digits
  37.     expo is an integer"""
  38.     res = decoder.match(s)
  39.     if res is None:
  40.         raise NotANumber, s
  41.     
  42.     (sign, intpart, fraction, exppart) = res.group(1, 2, 3, 4)
  43.     if sign == '+':
  44.         sign = ''
  45.     
  46.     if fraction:
  47.         fraction = fraction[1:]
  48.     
  49.     if exppart:
  50.         expo = int(exppart[1:])
  51.     else:
  52.         expo = 0
  53.     return (sign, intpart, fraction, expo)
  54.  
  55.  
  56. def unexpo(intpart, fraction, expo):
  57.     '''Remove the exponent by changing intpart and fraction.'''
  58.     if expo > 0:
  59.         f = len(fraction)
  60.         intpart = intpart + fraction[:expo]
  61.         fraction = fraction[expo:]
  62.         if expo > f:
  63.             intpart = intpart + '0' * (expo - f)
  64.         
  65.     elif expo < 0:
  66.         i = len(intpart)
  67.         intpart = intpart[:expo]
  68.         fraction = intpart[expo:] + fraction
  69.         if expo < -i:
  70.             fraction = '0' * (-expo - i) + fraction
  71.         
  72.     
  73.     return (intpart, fraction)
  74.  
  75.  
  76. def roundfrac(intpart, fraction, digs):
  77.     '''Round or extend the fraction to size digs.'''
  78.     f = len(fraction)
  79.     if f <= digs:
  80.         return (intpart, fraction + '0' * (digs - f))
  81.     
  82.     i = len(intpart)
  83.     if i + digs < 0:
  84.         return ('0' * -digs, '')
  85.     
  86.     total = intpart + fraction
  87.     nextdigit = total[i + digs]
  88.     if nextdigit >= '5':
  89.         n = i + digs - 1
  90.         while n >= 0:
  91.             if total[n] != '9':
  92.                 break
  93.             
  94.             n = n - 1
  95.         total = '0' + total
  96.         i = i + 1
  97.         n = 0
  98.         total = total[:n] + chr(ord(total[n]) + 1) + '0' * (len(total) - n - 1)
  99.         intpart = total[:i]
  100.         fraction = total[i:]
  101.     
  102.     if digs >= 0:
  103.         return (intpart, fraction[:digs])
  104.     else:
  105.         return (intpart[:digs] + '0' * -digs, '')
  106.  
  107.  
  108. def fix(x, digs):
  109.     """Format x as [-]ddd.ddd with 'digs' digits after the point
  110.     and at least one digit before.
  111.     If digs <= 0, the point is suppressed."""
  112.     if type(x) != type(''):
  113.         x = repr(x)
  114.     
  115.     
  116.     try:
  117.         (sign, intpart, fraction, expo) = extract(x)
  118.     except NotANumber:
  119.         return x
  120.  
  121.     (intpart, fraction) = unexpo(intpart, fraction, expo)
  122.     (intpart, fraction) = roundfrac(intpart, fraction, digs)
  123.     while intpart and intpart[0] == '0':
  124.         intpart = intpart[1:]
  125.     if intpart == '':
  126.         intpart = '0'
  127.     
  128.     if digs > 0:
  129.         return sign + intpart + '.' + fraction
  130.     else:
  131.         return sign + intpart
  132.  
  133.  
  134. def sci(x, digs):
  135.     """Format x as [-]d.dddE[+-]ddd with 'digs' digits after the point
  136.     and exactly one digit before.
  137.     If digs is <= 0, one digit is kept and the point is suppressed."""
  138.     if type(x) != type(''):
  139.         x = repr(x)
  140.     
  141.     (sign, intpart, fraction, expo) = extract(x)
  142.     if not intpart:
  143.         while fraction and fraction[0] == '0':
  144.             fraction = fraction[1:]
  145.             expo = expo - 1
  146.         if fraction:
  147.             intpart = fraction[0]
  148.             fraction = fraction[1:]
  149.             expo = expo - 1
  150.         else:
  151.             intpart = '0'
  152.     else:
  153.         expo = expo + len(intpart) - 1
  154.         intpart = intpart[0]
  155.         fraction = intpart[1:] + fraction
  156.     digs = max(0, digs)
  157.     (intpart, fraction) = roundfrac(intpart, fraction, digs)
  158.     if len(intpart) > 1:
  159.         intpart = intpart[0]
  160.         fraction = intpart[1:] + fraction[:-1]
  161.         expo = expo + len(intpart) - 1
  162.     
  163.     s = sign + intpart
  164.     if digs > 0:
  165.         s = s + '.' + fraction
  166.     
  167.     e = repr(abs(expo))
  168.     e = '0' * (3 - len(e)) + e
  169.     if expo < 0:
  170.         e = '-' + e
  171.     else:
  172.         e = '+' + e
  173.     return s + 'e' + e
  174.  
  175.  
  176. def test():
  177.     '''Interactive test run.'''
  178.     
  179.     try:
  180.         while None:
  181.             (x, digs) = input('Enter (x, digs): ')
  182.             print x, fix(x, digs), sci(x, digs)
  183.     except (EOFError, KeyboardInterrupt):
  184.         pass
  185.  
  186.  
  187.